# $OpenBSD: Makefile,v 1.33 2012/07/17 09:35:09 jasper Exp $
REGRESS_TARGETS = test-compile-0 test-link-0 test-install-0 \
	test-run-0 test-link-1 test-install-1 test-run-1 \
	test-link-2 test-link-3 test-link-4 \
	test-link-5 test-link-6 test-run-2 test-run-3 \
	error-1 error-2 error-3 test-alternate-0 \
	test-implicit-0 test-run-4 test-implicit-1 \
	test-help error-4 error-6 test-bond test-implicit-2 \
	test-Wc test-Xcompiler stupid-gdb pthread-0 pthread-1 \
	pthread-2 test-o-0

COMPILE_TESTS = compile-mode-0 compile-mode-1 compile-mode-2 \
	compile-mode-3 compile-mode-4 compile-mode-5 \
	compile-mode-6 compile-mode-7 compile-mode-8 \
	compile-mode-9 compile-mode-10 compile-mode-11 \
	compile-mode-12 compile-mode-13

FAILING_TARGETS += error-0
.include <bsd.own.mk>
.if defined(NOPIC)
FAILING_TARGETS += static-arch-fail
.else
REGRESS_TARGETS += version-override-0 version-override-1 error-5 \
		    ${COMPILE_TESTS} prefer-static linkception-0 \
		    release-0 release-1 trip-0
FAILING_TARGETS += test-all-static
.endif

REGRESS_TARGETS += ${FAILING_TARGETS}

compile-tests: ${COMPILE_TESTS}

LIBTOOL ?= /usr/bin/libtool

DEST = ${.OBJDIR}/dest/usr/local
DEST2 = ${.OBJDIR}/dest2/usr/local
DEST3 = ${.OBJDIR}/dest3/usr/local

WEIRD = a++b.weird
NOTWEIRD = a__b_weird

test-compile-0: ${OBJLA}

test-link-0: liba.la

test-link-1: p1

test-run-0: p1
	./p1

test-link-2: liba0.la liba1.la

test-link-3: p2

test-run-2: p2
	./p2

test-install-0: ${DEST}/lib/liba.la

test-install-1: ${DEST}/bin/p1

test-run-1: ${DEST}/bin/p1
	LD_LIBRARY_PATH=${DEST}/lib ${DEST}/bin/p1

test-run-3:  ${DEST}/bin/p2
	LD_LIBRARY_PATH=${DEST}/lib ${DEST}/bin/p2

test-run-4: p2
	${LIBTOOL} --mode=execute p2

test-help:
	${LIBTOOL} --help > /dev/null

# affects sysutils/nut
test-all-static: s1
	file ${.OBJDIR}/.libs/s1 | grep 'statically linked'

s1: c.lo liba.la
	${LIBTOOL} --mode=link ${CC} ${CFLAGS} -o s1 c.lo -la -all-static

error-0: liba.la
# this should error out (not absolute directory)
	if ${LIBTOOL} --mode=install cp liba.la dest; then exit 1; fi

test-bond: dummy3.c
	# one single instance of -o
	@if ${LIBTOOL} --mode=compile cc -c -o dummy3.lo -o 7 dummy3.c; then exit 1; fi

dummy.c dummy2.c dummy3.c:
	@touch $@

dummy2.lo: dummy2.c
	${LIBTOOL} --mode=compile --tag=disable-shared --tag=disable-static ${CC} -c -o dummy2.lo dummy2.c

error-1: dummy.c
	${LIBTOOL} --mode=compile --tag=notatag ${CC} -c -o dummy.lo dummy.c 2>&1|fgrep -q "ignoring unknown tag"

error-2: dummy.c
	if ${LIBTOOL} --mode=compile --tag=@ ${CC} -c -o dummy.lo dummy.c; then exit 1; fi
	
error-3: dummy.c
	if ${LIBTOOL} --mode=foo ${CC} -c -o dummy.lo dummy.c; then exit 1; fi
	
error-4: dummy.c
	# libtool -mode=... is an invalid option
	@if ${LIBTOOL} -mode=compile ${CC} -c -o dummy.lo dummy.c; then exit 1; fi

error-5: libbad.la
	fgrep -q "library_names=''" libbad.la || exit 1

error-6:
	# implicit mode detection failure: libtool foo
	@if ${LIBTOOL} foo; then exit 1; fi

prefer-static: dummy2.lo
	if fgrep -q .libs/dummy2.o dummy2.lo; then exit 1; fi

test-alternate-0: dummy.c
	${LIBTOOL} compile ${CC} -c -o dummy.lo dummy.c
	${LIBTOOL} comp ${CC} -c -o dummy.lo dummy.c

test-implicit-0: dummy.c
	${LIBTOOL} ${CC} -c -o dummy.lo dummy.c

test-implicit-1: liba.la
	mkdir -p ${DEST2}/lib
	${LIBTOOL} install liba.la ${DEST2}/lib/liba.la

test-implicit-2: liba.la
	mkdir -p ${DEST3}/lib
	${LIBTOOL} install -c liba.la ${DEST3}/lib/liba.la

version-override-0: liba9.la
	fgrep -q "liba9.so.4.2" liba9.la

version-override-1: lib${WEIRD}.la
	fgrep -q "lib${WEIRD}.so.5.6" lib${WEIRD}.la

static-arch-fail:
	@echo "Some tests are not run on static architectures"
	@exit 1

compile-mode-0: dummy.c
	${LIBTOOL} --mode=compile ${CC} -c dummy.c|tee out0
	@fgrep .libs/dummy.o out0|fgrep -q -- -fPIC
	@fgrep -q ' dummy.o' out0
	@if fgrep ' dummy.o' out0|fgrep -q -- -fPIC; then exit 1; fi

compile-mode-1: dummy.c
	${LIBTOOL} --mode=compile --tag=disable-shared ${CC} -c dummy.c|tee out1
	@if fgrep -q .libs/dummy.o out1; then exit 1; fi
	@fgrep -q ' dummy.o' out1
	@if fgrep ' dummy.o' out1|fgrep -q -- -fPIC; then exit 1; fi

compile-mode-2: dummy.c
	${LIBTOOL} --mode=compile --tag=disable-static ${CC} -c dummy.c|tee out2
	@fgrep .libs/dummy.o out2|fgrep -q -- -fPIC
	@if fgrep -q ' dummy.o' out2; then exit 1; fi

compile-mode-3: dummy.c
	# can't disable both, will keep static
	${LIBTOOL} --mode=compile --tag=disable-static --tag=disable-shared ${CC} -c dummy.c|tee out3
	@if fgrep -q .libs/dummy.o out3; then exit 1; fi
	@fgrep -q ' dummy.o' out3
	@if fgrep ' dummy.o' out3|fgrep -q -- -fPIC; then exit 1; fi

compile-mode-4: dummy.c
	# can't disable both, will keep static
	${LIBTOOL} --mode=compile --tag=disable-shared --tag=disable-static ${CC} -c dummy.c|tee out4
	@if fgrep -q .libs/dummy.o out4; then exit 1; fi
	@fgrep -q ' dummy.o' out4
	@if fgrep ' dummy.o' out4|fgrep -- -fPIC; then exit 1; fi

compile-mode-5: dummy.c
	${LIBTOOL} --mode=compile ${CC} -static -c dummy.c|tee out5
	@if fgrep -q .libs/dummy.o out5; then exit 1; fi
	@fgrep -q ' dummy.o' out5
	@if fgrep ' dummy.o' out5|fgrep -- -fPIC; then exit 1; fi

compile-mode-6: dummy.c
	${LIBTOOL} --mode=compile ${CC} -static -prefer-pic -c dummy.c|tee out6
	@if fgrep -q .libs/dummy.o out6; then exit 1; fi
	@fgrep ' dummy.o' out6|fgrep -q -- -fPIC

compile-mode-7: dummy.c
	${LIBTOOL} --mode=compile ${CC} -static -fpie -c dummy.c|tee out7
	@if fgrep -q .libs/dummy.o out7; then exit 1; fi
	@fgrep ' dummy.o' out7|fgrep -q -- -fpie
	@if fgrep ' dummy.o' out7|fgrep -- -fpie|fgrep -q -- -fPIC; then exit 1; fi

compile-mode-8: dummy.c
	${LIBTOOL} --mode=compile ${CC} -static -prefer-pic -fpie -c dummy.c|tee out8
	@if fgrep -q .libs/dummy.o out8; then exit 1; fi
	@fgrep ' dummy.o' out8|fgrep -q -- -fPIC
	@if fgrep ' dummy.o' out8|fgrep -- -fPIC|fgrep -q -- -fpie;  then exit 1; fi

compile-mode-9: dummy.c
	${LIBTOOL} --mode=compile ${CC} -shared -c dummy.c|tee out9
	@fgrep -q .libs/dummy.o out9

compile-mode-10: dummy.c
	${LIBTOOL} --mode=compile ${CC} -shared -prefer-non-pic -c dummy.c|tee out10
	@fgrep .libs/dummy.o out10|fgrep -q -- -fPIC

compile-mode-11: dummy.c
	# -shared + -static -> static
	${LIBTOOL} --mode=compile ${CC} -shared -static -c dummy.c|tee out11
	@if fgrep -q .libs/dummy.o out11; then exit 1; fi
	@fgrep -q ' dummy.o' out11
	@if fgrep ' dummy.o' out11|fgrep -q -- -fPIC; then exit 1; fi

compile-mode-12: dummy.c
	# -shared + -static -> static
	${LIBTOOL} --mode=compile ${CC} -shared -static -prefer-pic -c dummy.c|tee out12
	@if fgrep -q .libs/dummy.o out12; then exit 1; fi
	@fgrep ' dummy.o' out12|fgrep -q -- -fPIC

compile-mode-13: dummy.c
	# -static + -shared ->  configuration error
	if ${LIBTOOL} --mode=compile ${CC} -static -shared -c dummy.c; then exit 1; fi

test-Wc: 
	${LIBTOOL} --mode=compile ${CC} -c -Wc,-DA,-DB ${.CURDIR}/d.c

test-Xcompiler: 
	${LIBTOOL} --mode=compile ${CC} -c -Xcompiler -DA -Xcompiler -DB ${.CURDIR}/d.c

stupid-gdb:
	@${LIBTOOL} --config|fgrep -q 'objdir=.libs'

linkception-0: e.lo
	# check that linking with libX11 works, which is funny to do
	# since -lX11 brings in -lxcb, BUT -lxcb wants some other stuff
	# afterwards !
	${LIBTOOL} --mode=link ${CC} -o e -L/usr/X11R6/lib e.lo -lX11

test-link-4: e.lo
	@if ${LIBTOOL} --mode=link ${CC} -o e -L /usr/X11R6/lib e.lo -lX11; then exit 1; fi

# check that -x c works with libraries linking
test-link-5: liba4.la

# but not with programs !!!
test-link-6: e.lo
	@if ${LIBTOOL} --mode=link ${CC} -o e -x c e.lo 2>/dev/null; then exit 1; fi

test-o-0: e.lo
	@if ${LIBTOOL} --mode=link ${CC} -oe e.lo; then exit 1; fi
	
pthread-0: e.lo liba2.la
	@${LIBTOOL} --mode=link ${CC} -o e e.lo -la2|tee out.13
	@fgrep -q -- -pthread out.13

pthread-1: e.lo liba2.la
	@${LIBTOOL} --mode=link ${CC} -pthread -o e e.lo -la2|tee out.14
	@fgrep -q -- -pthread out.14
	@if grep -q -- "-pthread.*-pthread" out.14; then exit 1; fi

pthread-2: e.lo
	${LIBTOOL} --mode=link ${CC} -o e -pthread -pthread e.lo |tee out.15
	@fgrep -q -- -pthread out.15
	@if grep -q -- "-pthread.*-pthread" out.15; then exit 1; fi

release-0: liba3.la
	test -f .libs/liba3-0.so.0.0 || exit 1

release-1: ${DEST}/lib/liba3.la
	@test -h ${DEST}/lib/liba3.so.0.0
	@test `readlink ${DEST}/lib/liba3.so.0.0` = liba3-0.so.0.0

trip-0: dummy.c a.lo b.lo
	rm -f .libs/libtrip.so.10.5
	mkdir -p lib1
	${CC} -shared -o  lib1/libtrip.so.10.5 dummy.c
	${CC} -shared -o  lib1/libtrip.so.10.10 dummy.c
	${LIBTOOL} --mode=link ${CC} -o libbogus.la -Llib1 ${SOPTS} a.lo b.lo -ltrip
	if test -e .libs/libtrip.so.10.5; then exit 1; fi

#weird-shit-1: a.lo
#	${LIBTOOL} --mode=link ${CC} -rpath /usr/local/lib --export-symbols a.def -o liba2.la a.lo
#
${DEST}/bin/p1: ${DEST}/lib/liba.la
${DEST}/bin/p2: ${DEST}/lib/liba0.la ${DEST}/lib/liba1.la

# basic framework to build/link stuff
SOPTS = -version-info 0:0:0 -rpath /usr/local/lib

LIBS = a a0 a1 a2 a3 a4 bad a9 ${WEIRD}
PROGS = p1 p2

OBJ_a = a.lo b.lo
a_OPTS = ${SOPTS}

OBJ_a0 = a.lo
a0_OPTS = ${SOPTS}

OBJ_a1 = b.lo
a1_OPTS = ${SOPTS} -la0

OBJ_a2 = a.lo b.lo
a2_OPTS = ${OPTS} -pthread

OBJ_a3 = a.lo b.lo
a3_OPTS = ${a_OPTS} -release 0

OBJ_a4 = a.lo b.lo
a4_OPTS = -x c ${a_OPTS} 

# libbad has a bogus rpath option
OBJ_bad = a.lo b.lo
bad_OPTS = --version-info 0:0:0 --rpath /usr/local/lib

OBJ_a9 = ${OBJ_a}
a9_OPTS = ${a_OPTS}
LIBS_ENV = liba9_ltversion=4.2

OBJ_${WEIRD} = ${OBJ_a}
${WEIRD}_OPTS = ${a_OPTS}
LIBS_ENV += lib${NOTWEIRD}_ltversion=5.6

OBJ_p1 = c.lo liba.la
LINK_p1 = c.lo -la

OBJ_p2 = c.lo liba0.la liba1.la
LINK_p2 = c.lo -la1


# stuff to compile/link/install everything
.SUFFIXES: .lo

.c.lo:
	${LIBTOOL} --mode=compile ${CC} -c ${CFLAGS} ${.CURDIR}/$*.c

.for p in ${PROGS}
$p: ${OBJ_$p}
	${LIBTOOL} --mode=link ${CC} ${CFLAGS} -o $@ ${LINK_$p}
.endfor

.for t in ${PROGS}
${DEST}/bin/$t: $t
	mkdir -p ${DEST}/bin
	${LIBTOOL} --mode=install cp $t ${DEST}/bin/$t
.endfor

.for t in ${LIBS}
${DEST}/lib/lib$t.la: lib$t.la
	mkdir -p ${DEST}/lib
	${LIBTOOL} --mode=install cp lib$t.la ${DEST}/lib/lib$t.la
.endfor

.for l in ${LIBS}
lib$l.la: ${OBJ_$l}
	${LIBS_ENV} ${LIBTOOL} --mode=link ${CC} ${CFLAGS} -o $@ ${$l_OPTS} ${OBJ_$l}
.endfor

CLEANFILES += ${PROGS} s1 *.c *.o *.lo *.la .libs/* lib1/* out*
CLEANFILES += ${DEST}/bin/* ${DEST}/lib/* ${DEST2}/lib/* ${DEST3}/lib/*

.PHONY: ${REGRESS_TARGETS} regress compile-tests

.include <bsd.regress.mk>
